package vue;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import controleur.Controleur;

public class FenetrePrincipale extends JFrame implements ActionListener {

	private Controleur ctrl;
	private JMenuBar menuBar;
	private JMenu menuFichier, menuAdmin, menuInfo;
	private JMenuItem sInscrire, seConnecter, quitter, seDeconnecter,
						majResultat, nouveauxMatchs, gestionUtilisateur, gestionEquipe,
						classement, infosChampionnat;
	private JPanel panelCon,pane;
	private PanelPronostique panelPronostique;
	private PanelClassement panelClassement;
	private PanelStats panelStats;
	private GridLayout grid;
	
	public FenetrePrincipale(Controleur ctrl) {

		this.ctrl = ctrl;
		setTitle("PronOSTIque");
		setLocation(50, 50);
		setSize(800, 400);
		pane = new JPanel();
		pane.setPreferredSize(new Dimension(800,400));
		grid = new GridLayout(1,2);
		pane.setLayout(grid);
		
		creerMenu();
		panelClassement = new PanelClassement(this);
		panelPronostique = new PanelPronostique(this,false);
		
		pane.add(panelClassement);
		pane.add(panelPronostique);
		

		this.setContentPane(pane);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				System.exit(0);
			}
		});

		setVisible(true);
	}

	private void creerMenu() {

		menuBar = new JMenuBar();

		//------------------
		//---- FICHIER -----
		//------------------
		menuFichier = new JMenu("Fichier");

		sInscrire = new JMenuItem("S'inscrire");
		seConnecter = new JMenuItem("Se connecter");
		seDeconnecter = new JMenuItem("Se déconnecter");
		quitter = new JMenuItem("Quitter");

		sInscrire.addActionListener(this);
		seConnecter.addActionListener(this);
		seDeconnecter.addActionListener(this);
		quitter.addActionListener(this);

		seDeconnecter.setEnabled(false);
		
		menuFichier.add(seConnecter);
		menuFichier.add(sInscrire);
		menuFichier.add(seDeconnecter);
		menuFichier.add(quitter);

		menuBar.add(menuFichier);
		
		
		//------------------
		//------ Infos -----
		//------------------
		menuInfo = new JMenu("Infos");

		classement = new JMenuItem("Classement");
		infosChampionnat = new JMenuItem("Infos Championnat");
		
		classement.addActionListener(this);
		infosChampionnat.addActionListener(this);
		
		menuInfo.add(classement);
		menuInfo.add(infosChampionnat);
		
		menuBar.add(menuInfo);
		
		
		//------------------
		//------ Admin -----
		//------------------
		menuAdmin = new JMenu("Admin");

		majResultat = new JMenuItem("MAJ Résultat");
		nouveauxMatchs = new JMenuItem("Nouveaux Matchs");
		gestionUtilisateur = new JMenuItem("Gestion des utilisateurs");
		gestionEquipe = new JMenuItem("Gestion des équipes");

		majResultat.addActionListener(this);
		nouveauxMatchs.addActionListener(this);
		gestionUtilisateur.addActionListener(this);
		gestionEquipe.addActionListener(this);
				
		menuAdmin.add(majResultat);
		menuAdmin.add(nouveauxMatchs);
		menuAdmin.add(gestionUtilisateur);
		menuAdmin.add(gestionEquipe);
		
		menuBar.add(menuAdmin);
		
		majMenuConnexion(false, false);
		this.setJMenuBar(menuBar);

	}
	


	public Controleur getControleur() {
		return ctrl;
	}
	
	public PanelClassement getPanelClassement() {
		return panelClassement;
	}

	public PanelPronostique getPanelPronostique() {
		return panelPronostique;
	}
	

	/**
	 * 
	 * @param seConnecte = true lors d'une connexion, false lors d'une déconnexion
	 */
	public void majMenuConnexion(boolean seConnecte, boolean admin) {
		if(seConnecte) {
			seConnecter.setEnabled(false);
			seDeconnecter.setEnabled(true);
			sInscrire.setEnabled(false);
			menuInfo.setVisible(true);
			
			if(admin) {
				menuAdmin.setVisible(true);
				menuInfo.setVisible(false);
			}
		} else {
			//ctrl.setUtilisateurCourant(null);
			seConnecter.setEnabled(true);
			sInscrire.setEnabled(true);
			seDeconnecter.setEnabled(false);
			menuInfo.setVisible(false);
			menuAdmin.setVisible(false);
		}
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == quitter) {
			ctrl.sauvegarderListeUtilisateurs();
			System.exit(0);
		}else if(e.getSource() == infosChampionnat) {
			new PopupInfoChampionnat(this);
		}else if (e.getSource() == sInscrire) {
			new PopupInscription(this);
		}else if (e.getSource() == seConnecter) {
			new PopupConnexion(this);
		}else if (e.getSource() == seDeconnecter) {
			int choix = JOptionPane.showConfirmDialog(this, "Voulez-vous vous déconnecter ?", "Déconnexion", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
			if(choix == JOptionPane.OK_OPTION) {
				majMenuConnexion(false, false);
				if(!ctrl.getUtilisateurCourant().isAdmin()) {
					ctrl.setUtilisateurCourant(null);
					this.setPanelClassement(new PanelClassement(this));
					this.setPanelPronostique(new PanelPronostique(this,false));
				}
				ctrl.setUtilisateurCourant(null);

				
			}
		} else if(e.getSource() == classement) {
			new PopupClassement(this);		
		}else if (ctrl.getUtilisateurCourant().isAdmin()) {
			if(e.getSource() == gestionUtilisateur) {
				new PopupGestionUtilisateur(this);
			}else if (e.getSource() == majResultat) {
				new PopupMajResultat(this);
			}else if (e.getSource() == nouveauxMatchs) {
				new PopupNouveauxMatchs(this);
			}else if (e.getSource() == gestionEquipe) {
				new PopupGestionEquipe(this);
			}
		}
	}

	public void setPanelPronostique(PanelPronostique panelPronostique2) {
		pane.remove(this.panelPronostique);
		this.panelPronostique = panelPronostique2;
		pane.add(panelPronostique2);
		repaint();
		
	}
	
	public void setPanelClassementPourStat(PanelStats panelStats) {
		pane.remove(this.panelClassement);
		this.panelStats = panelStats;
		pane.add(panelStats);
		repaint();
		
	}
	public void setPanelClassement(PanelClassement panelClas) {
		pane.remove(this.panelStats);
		this.panelClassement=panelClas;
		pane.add(panelClas);
		repaint();
		
	}
}
